package com.imooc.SmartChargeStation.demo.netty.handlers;

import com.imooc.SmartChargeStation.demo.netty.util.ConnectUtil;
import com.imooc.SmartChargeStation.demo.netty.util.ConstantUtil;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.EventLoop;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;

/**
 * author: zpy
 * description: 掉线重连 (客户端) 处理器
 * date: 2025/8/22
 */

@Slf4j
public class ImoocClientDisconnHandler extends ChannelInboundHandlerAdapter {

    //连接工具类
    private ConnectUtil util = new ConnectUtil();


    /**
     * description: Channel 连接成功会触发
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        //ctx.fireChannelActive();
        /*
        当ChannelInboundHandlerAdapter的channelActive方法中添加了其他逻辑
        该写法可以确保这些逻辑被执行，而ctx.fireChannelActive()会跳过掉这些逻辑
        */
        super.channelActive(ctx);

    }

    /**
     * description: Channel 断开连接会触发
     */

    /**
     * @param ctx：参数是通道处理器上下文，包含了当前通道（Channel）的信息，用于操作通道或者获取事件循环
     * @throws Exception
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
      
        //客户端执行重新连接机制
        log.info(">>>>>Netty 客户端和服务端断开了连接, 重连中...");

        //若连接不上, 单独启动一条线程不断的重新连接
        final EventLoop loop = ctx.channel().eventLoop();
        //周期的执行重新连接，通过定时任务方法
        loop.schedule(new Runnable() {
            //单独启动线程
            @Override
            public void run() {
                util.connect(ConstantUtil.HOST,ConstantUtil.PORT);
            }
        },10, TimeUnit.SECONDS);
        
    }

    /**
     * description: 收到消息会触发
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        super.channelRead(ctx, msg);
    }
}
